
package com.jf.cloud.user.service;

import com.jf.cloud.api.user.dto.FinanceDetailDTO;
import com.jf.cloud.api.user.vo.FinanceDetailExcelVO;
import com.jf.cloud.api.user.vo.FinanceDetailVO;
import com.jf.cloud.api.user.vo.UserPayInfoVO;
import com.jf.cloud.common.database.dto.PageDTO;
import com.jf.cloud.common.database.vo.PageVO;
import com.jf.cloud.user.dto.UserLevelLogDTO;
import com.jf.cloud.user.model.UserLevelLog;
import com.jf.cloud.user.vo.UserLevelLogVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 用户等级记录
 *
 * @author zz
 * @date 2021-05-14 11:04:52
 */
public interface UserLevelLogService {

    /**
     * 分页获取用户等级记录列表
     * @param pageDTO 分页参数
     * @return 用户等级记录列表分页数据
     */
    PageVO<UserLevelLogVO> pageBuyLevelLog(PageDTO pageDTO, UserLevelLogDTO userLevelLogDTO);

    /**
     * 根据用户等级记录id获取用户等级记录
     *
     * @param levelLogId 用户等级记录id
     * @return 用户等级记录
     */
    UserLevelLog getByLevelLogId(Long levelLogId);

    /**
     * 保存用户等级记录
     * @param userLevelLog 用户等级记录
     */
    void save(UserLevelLog userLevelLog);

    /**
     * 更新用户等级记录
     * @param userLevelLog 用户等级记录
     */
    void update(UserLevelLog userLevelLog);

    /**
     * 根据用户等级记录id删除用户等级记录
     * @param levelLogId 用户等级记录id
     */
    void deleteById(Long levelLogId);

    /**
     * 批量保存用户等级变更日志
     * @param userLevelLogs 保存日志列表
     * @return 影响行数
     */
    int batchSaveUserLevelLogs(List<UserLevelLog> userLevelLogs);

    /**
     * 获取用户最高的等级（普通会员）
     * @param userId 用户id
     * @return 用户等级
     */
    Integer getMaxLevelByUserId(Long userId);

    /**
     * 更新为支付成功状态
     *
     * @param levelLogId 日志id
     * @param payId      支付id
     * @param payType 支付类型
     * @return 影响行数
     */
    int updateToSuccess(Long levelLogId, Long payId, Integer payType);

    /**
     * 删除用户等级记录
     * @param userId 用户id
     * @return
     */
    void deleteByUserId(@Param("userId") Long userId);

    /**
     * 获取指定时间内的用户类型
     * @param userId
     * @param createTime
     * @return
     */
    Integer getUserTypeAtTime(Long userId, Date createTime);

    /**
     * 分页获取用户会员购买财务详情
     * @param pageDTO
     * @param financeDetailDTO
     * @return
     */
    PageVO<FinanceDetailVO> pageFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO);

    /**
     * 获取用户余额充值财务详情
     * @param financeDetailDTO
     * @return
     */
    List<FinanceDetailExcelVO> listFinanceDetail(FinanceDetailDTO financeDetailDTO);

    /**
     * 获取用户充值，购买会员财务信息
     * @param startTime
     * @param endTime
     * @return
     */
    List<UserPayInfoVO> listPayInfoVO(Date startTime, Date endTime);
}
